<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 函数作为返回值
        function create() {
            const a = 100;
            return function () {
                console.log(a);
            }
        }
        const fn = create();
        const a = 200;
        fn(); // 100
        // 第一个函数的执行在全局作用域下，函数定义是在create函数的作用域下还有a=100
        //解释
        // 在输出自由变量a时，输出函数在匿名函数里未找到a的定义，所以向上一级的作用域中进行查找，找到create函数这个作用域内，找到了a的定义和值，这样就可以输出了，值为100.

        // 函数作为参数被传递
        function print(fn1) {
            const a1 = 200;
            fn1();
        }
        const a1 = 100;
        function fn1() {
            console.log(a1);
        }
        print(fn1)// 100 
        // 在输出自由变量a1时，输出函数在fn1函数里未找到a1的定义，所以向上一级的作用域中进行查找，找到全局作用域并且找到了a的定义和值，这样就可以输出了，值为100.


        // 所以闭包的考察点在于：
        // 闭包：自由变量的查找，是在函数定义的地方，向上级作用域进行查找，不是在执行的地点方。


        function f1() {
            var max = 10;
            return function bar(x) {
                if (x > max) {
                    console.log(x);
                }
            };
        }
        var f2 = f1();
        f2(15);
    </script>
</body>

</html>